Skip to content
字数
2601 字
阅读时间
11 分钟

一、重点知识

1.1 配置文件读取

在javaweb项目中配置文件也随着class文件一起储存在WEB-INF/classes文件中,与java项目不同,因此读取配置文件不能以磁盘路径读取,读取配置文件的方法由以下几种:
1.调用ServletContext的getRealPath(path)方法,将配置文件在服务器中的虚拟路径传入(虚拟路径即以webapps下的项目名为根目录),返回该配置文件的绝对路径。然后可通过字节流读取该文件,还可调用getResourceAsStream(path)方法,将虚拟路径传入,直接返回该配置文件的字节输入流对象
2.直接获得该Servlet类的类对象的类加载器。然后调用getResourceAsStream(path)方法;

1.2 请求乱码

java
使用String对器进行重新编码  该方法不分请求方式
String username = new String(req.getParameter("username").getBytes("ISO-8859-1"),"UTF-8");
post提交方式 
 通过 setCharacterEncoding方法设置获取响应内容的格式,在获取数据之前进行修改格式 设置的字符集要和页面保持一致
    URLEncoder.encode(str,"UTF-8");
get提交方式
通过 setCharacterEncoding方法设置获取响应内容的格式,在获取数据之前进行修改格式
在tomcat服务器的conf/server.xml中,在端口的Connector标签中添加 useBodyEncodingForURI=true

1.3 cookie相关

java
//创建Cookie对象
Cookie c = new Cookie("String name","String value");
//设置有效期
// 负数:默认值,浏览器关闭时,cookie被销毁
c.setMaxAge(int seconds);
//设置有效路径
c.setPath(String uri)
//响应Cookie信息给客户端
resp.addCookie(c);
//Cookie的获取
//获取Cookie信息数组
Cookie[] cks = req.getCookies();
String   getName() ;//获得名称     k
String   getValue();// 获得值       v
setValue(java.lang.String newValue);//设置内容,用于修改key对应的value值
//一个Cookie对象储存一条数据,多条数据,可以多创建几个Cookie对象进行储存
// tomcat8之前存储中文可以通过url编码后存储,tomcat8支持中文,但不支持特殊字符。

1.4 Session

Session的钝化和活化:

钝化:在服务器正常关闭后,Tomcat会自动将Session数据写入硬盘的文件中

  • 钝化的数据路径为:项目目录\target\tomcat\work\Tomcat\localhost\项目名称\SESSIONS.ser

  • 活化:再次启动服务器后,从文件中加载数据到Session中

    • 数据加载到Session中后,路径中的SESSIONS.ser文件会被删除掉

session的销毁会有两种方式:

默认情况下,无操作,默认30分钟自动销毁,在WEB.xml中配置 分钟数

xml
<session-config>
    <session-timeout>100</session-timeout>
</session-config>

直接销毁

java
// 销毁
session.invalidate();
java
HttpSession session = request.getSession();
//2. 存储数据
session.setAttribute("username","zs");
//2. 获取数据
Object username = session.getAttribute("username");

1.5 过滤器Filter

  • 作用:对服务器接受的请求资源和响应给浏览器的资源进行管理。保护servlet

  • 执行流程:dofilter放行方法前逻辑-> 放行访问资源-> 放行方法后逻辑优先级是按照过滤器类名(字符串)的自然排序

  • 过滤器链:多个过滤器组成的过滤链。注解配置Filter

  • 使用

    java
    //实现Filter接口,配置Filter拦截资源的路径:在类上定义 `@WebFilter` 注解。而注解的 `value` 属性值 `/*` 表示拦截所有的资源
    // 重新init方法 服务器启动即执行。资源初始化
    void init(){}
    
    // 重写doFilter方法 拦截请求,需手动放行
    //放行:  chain.doFilter(request, response);
    
    // destory方法: 服务器关闭执行。
    //需在web.xml中配置
    <filter>
        <filter-name>demo1</filter-name>
        <filter-class>cn.itcast.web.filter.FilterDemo1</filter-class>
    </filter>
    <filter-mapping>
    	<filter-name>demo1</filter-name>
    	<!-- 拦截路径 -->
    	<url-pattern>/*</url-pattern>
    </filter-mapping>
    <dispatcher>资源被访问的方式</dispatcher>
    拦截方式配置:资源被访问的方式
    	* 注解配置:
    		* 设置dispatcherTypes属性
    		1. REQUEST:默认值。浏览器直接请求资源
    		2. FORWARD:转发访问资源
    		3. INCLUDE:包含访问资源
    		4. ERROR:错误跳转资源
    		5. ASYNC:异步访问资源
  • 生命周期

    当服务器启动后,实例化过滤器,调用init方法进行初始化。
    当客户端发送一次请求,就调用一次过滤器中doFilter方法进行过滤
    要么是放行:chain.doFilter(req,resp);
    要么不放行:不写
    当服务器关闭的时候,过滤器销毁,调用destory方法进行资源回收

1.5 监听器

  • 作用:监听作用域对象request、session、application的创建、销毁和内容的改变时自动执行代码的功能组件

  • 内置监听器

    监听器分类监听器名称作用
    ServletContext监听ServletContextListener用于对ServletContext对象进行监听(创建、销毁)
    ServletContextAttributeListener用于对ServletContext对象中属性的监听(增删改属性)
    Session监听HttpSessionListener对Session对象的整体状态的监听(创建、销毁)
    HttpSessionAttributeListener对Session对象中的属性的监听(增删改属性)
    HttpSessionBindingListener监听对象于Session的绑定和解除
    HttpSessionActivationListener对Session数据的钝化和活化的监听
    Request监听ServletRequestListener对Request对象进行监听(创建、销毁)
    ServletRequestAttributeListener对Request对象中属性的监听(增删改属性)
  • 使用

    java
    //监听request
    //ServletRequestListener 
    requestInitialized(ServletRequestEvent sre);//创建
    requestDestroyed(ServletRequestEvent sre);//销毁
    //形参可以获取监听的request对象 sre.getServletRequest();
    
    // 监听request作用域数据的变更。
    //ServletRequestAttributeListener  
    attributeAdded(ServletRequestAttributeEvent srae);//新增
    attributeRemoved(ServletRequestAttributeEvent srae);//移除
    attributeReplaced(ServletRequestAttributeEvent srae);//修改
    //注意:形参可以获取被监听的数据	
    //srae.getName()  获取监听数据的键
    //srae.getValue() 获取监听数据的值
    
    //监听session的创建和销毁
    //HttpSessionListener 
    //sessionCreated(HttpSessionEvent se);//创建
    //sessionDestroyed(HttpSessionEvent se); //销毁
    //注意:形参可以获取被监听的session对象
    //se.getSession();
    
    // 监听session数据的变更
    //HttpSessionAttributeListener
    attributeAdded(HttpSessionBindingEvent event);//新增
    attributeRemoved(HttpSessionBindingEvent event);//移除
    attributeReplaced(HttpSessionBindingEvent event);//修改
    //注意:形参可以获取被监听的数据
    //event.getName() 	获取数据的键名
    //event.getValue()	获取数据的值
        
    //监听HttpSession中的属性的状态(javabean)
    //HttpSessionBindingListener
    valueBound(HttpSessionBindingEvent event);//创建
    valueUnbound(HttpSessionBindingEvent event);//销毁
    //只有实现了HttpSessionBindingListener的类,在和session绑定、解除绑定时触发其事件。
        
    //监听session的序列化和反序列化
    //HttpSessionActivationListener
    sessionWillPassivate(HttpSessionEvent se);//钝化(序列化)
    sessionDidActivate(HttpSessionEvent se);//活化(反序列化)
    
    //监听application对象的初始化和销毁
    //ServletContextListener 
    contextInitialized(ServletContextEvent sce);// 初始化 服务器启动
    contextDestroyed(ServletContextEvent sce);//销毁  服务器关闭
    //注意:
    //形参可以获取当前application对象。
    //sce.getServletContext();
    
    // 监听数据的变更
    //ServletContextAttributeListener
    attributeAdded(ServletContextAttributeEvent event);//新增
    attributeRemoved(ServletContextAttributeEvent event);//移除
    attributeReplaced(ServletContextAttributeEvent event);//修改
    //注意:形参可以获取当前监听的数据
    //event.getName()  获取数据的键名
    //event.getValue() 获取数据的值
  • 在web.xml中配置

    xml
    <listener>
      <listener-class>类的全路径</listener-class>
        <!--指定初始化参数<context-param>-->
    </listener>
  • 自定义监听器

    java
    // 实现监听器接口 ServletContextListener
    // 重写抽象方法
    // 在web.xml中配置或 添加@WebListener注解

1.6 Request

  • requestapi

    java
    // http://localhost:8080/request-demo/req1?username=zhangsan&passwrod=123
    /**
     * request 获取请求数据
     */
    @WebServlet("/req1")
    public class RequestDemo1 extends HttpServlet {
        @Override
        protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
            // String getMethod():获取请求方式: GET
            String method = req.getMethod();
            System.out.println(method);//GET
            // String getContextPath():获取虚拟目录(项目访问路径):/request-demo
            String contextPath = req.getContextPath();
            // 获取Servlet路径
            req.getServletPath();
            System.out.println(contextPath);
            // StringBuffer getRequestURL(): 获取URL(统一资源定位符):http://localhost:8080/request-demo/req1
            StringBuffer url = req.getRequestURL();
            System.out.println(url.toString());
            // String getRequestURI():获取URI(统一资源标识符): /request-demo/req1
            String uri = req.getRequestURI();
            System.out.println(uri);
            // String getQueryString():获取请求参数(GET方式): username=zhangsan
            String queryString = req.getQueryString();
            System.out.println(queryString);
            //获取协议及版本:HTTP/1.1
            req.getProtocol();
            //获取客户机的IP地址:
            req.getRemoteAddr();
            
            //获取请求头: user-agent: 浏览器的版本信息
            String agent = req.getHeader("user-agent");
    		System.out.println(agent);
            
             //1. 获取所有参数的Map集合
            Map<String, String[]> map = req.getParameterMap();
            for (String key : map.keySet()) {
                // username:zhangsan lisi
                System.out.print(key+":");
    
                //获取值
                String[] values = map.get(key);
                for (String value : values) {
                    System.out.print(value + " ");
                }
    
                System.out.println();
            }
            String[] hobbies = req.getParameterValues("hobby");
            for (String hobby : hobbies) {
                System.out.println(hobby);
            }
            
            //...
            String username = req.getParameter("username");
            String password = req.getParameter("password");
            System.out.println(username);
            System.out.println(password);
            
            // 获取服务器内部转发参数
            //存储数据
            request.setAttribute("msg","hello");
            //请求转发
            // request.getRequestDispatcher("/req6").forward(request,response);
            //获取数据
            Object msg = request.getAttribute("msg");
            System.out.println(msg);
    
        }
        @Override
        protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
            //获取post 请求体:请求参数
            //1. 获取字符输入流
            // BufferedReader流是通过request对象来获取的,当请求完成后request对象就会被销毁,request对象被销毁后,BufferedReader流就会自动关闭,所以此处就不需要手动关闭流了。
            BufferedReader br = req.getReader();
            //2. 读取数据
            String line = br.readLine();
            System.out.println(line);
        }
    }

1.7 Response

java
@WebServlet("/resp1")
public class ResponseDemo1 extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        System.out.println("resp1....");
        //重定向
        //1.设置响应状态码 302
        response.setStatus(302);
        //2. 设置响应头 Location
        response.setHeader("Location","/request-demo/resp2");
        //重定向
        resposne.sendRedirect("/request-demo/resp2");
        // 获取项目目录
        //动态获取虚拟目录
        String contextPath = request.getContextPath();
        response.sendRedirect(contextPath+"/resp2");
        
        // 返回响应的html数据
        // Content-disposition  服务器告诉客户端以什么格式打开响应体数据
         response.setContentType("text/html;charset=utf-8");
        //1. 获取字符输出流
        PrintWriter writer = response.getWriter();
		 writer.write("aaa");
        
        // 返回字节流数据
        //1. 读取文件
        FileInputStream fis = new FileInputStream("d://a.jpg");
        //2. 获取response字节输出流
        ServletOutputStream os = response.getOutputStream();
        //3. 完成流的copy
        byte[] buff = new byte[1024];
        int len = 0;
        while ((len = fis.read(buff))!= -1){
            os.write(buff,0,len);
        }
        fis.close();
        
        // 工具类简写
        //1. 读取文件
        FileInputStream fis = new FileInputStream("d://a.jpg");
        //2. 获取response字节输出流
        // content-disposition:attachment;filename=xxx  指定浏览器打开为下载和文件名称
        ServletOutputStream os = response.getOutputStream();
        //3. 完成流的copy
      	IOUtils.copy(fis,os);
        fis.close();
    }

    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        this.doGet(request, response);
    }
}

1.8 Servlet

servlet实现:继承Servlet方法,实现抽象方法,在web.xml中配置,或通过@WebServlet("资源路径")注解实现

xml
<!--配置Servlet -->
<servlet>
	<servlet-name>demo1</servlet-name>
	<servlet-class>cn.itcast.web.servlet.ServletDemo1</servlet-class>
</servlet>
<servlet-mapping>
	<servlet-name>demo1</servlet-name>
	<url-pattern>/demo1</url-pattern>
</servlet-mapping>

**生命周期:**方法有三个:

​ init方法

​ service方法

​ destroy方法

流程:

默认情况下第一次访问被创建(可以配置创建时机,<load-on-startup>为负数,第一次访问时创建,为0或正整数在服务器启动时创建):执行init方法,只执行一次,Servlet在内存中只存在一个对象,Servlet是单例的。

提供服务时执行service方法,每次被访问时都会调用一次。

服务器关闭时,servlet被销毁,执行destroy方法,一般用于释放资源。